const cp = require('child_process')
const ssh = require('ssh2')
const archiver = require('archiver')
const fs = require('fs')
const path = require('path')
//对项目进行打包，然后生成压缩文件
let pro = cp.spawn('npm run build', {
  shell: true,
  stdio: 'inherit',
})

pro.on('exit', async () => {
  //打包完成后  开始链接目标服务器，并自动部署
  console.log('complate')
  //压缩完成后开始链接服务器上传文件
  let zipSuccess = await startZip()
  //链接服务器上传文件
  let uploadSuccess = await connect()
  //
})

//开始打包
function startZip() {
  return new Promise((resolve, reject) => {
    let distPath = path.resolve(__dirname, '/dist')
    console.log('开始打包zip')
    //定义打包格式和相关配置
    const archive = archiver('zip', {
      zlib: { level: 9 },
    }).on('error', err => {
      throw err
    })
    const output = fs.createWriteStream(__dirname + `/dist.zip`)
    //监听流的打包
    output.on('close', err => {
      if (err) {
        console.log('关闭archiver异常')
        reject(err)
        process.exit(1)
      }
      console.log('目标打包完成')
      resolve(true)
    })
    //开始压缩
    archive.pipe(output)
    // 文件夹压缩
    archive.directory('dist/', false)
    archive.finalize()
  })
}

//链接服务器
let conn = new ssh.Client()

// 上传操作
function connect() {
  conn
    .on('ready', () => {
      conn.sftp((err, sftp) => {
        sftp.fastPut(
          './dist.zip',
          '/usr/local/nginx/dist.zip',
          {},
          (err, result) => {
            //开始上传
            shellCmd(conn)
          }
        )
      })
    })
    .connect({
      host: '47.112.96.71',
      port: '22',
      username: 'root',
      password: 'Yswg@oa2021',
    })
}
// 解压部署操作
async function shellCmd(conn) {
  conn.shell((err, stream) => {
    stream
      .end(
        `
         cd /usr/local/nginx
         unzip -o dist.zip -d dist/
         rm -rf dist.zip
         exit
        `
        //进入服务器暂存地址
        //解压上传的压缩包
        //移动解压后的文件到发布目录
        //删除压缩包
        //退出
      )
      .on('data', data => {
        console.log(data.toString())
      })
      .on('close', () => {
        //结束ssh
        conn.end()
        //结束后删除本地的dist.zip
        delZip()
      })
  })
}
//删除本地的dist.zip
function delZip() {
  let filepath = 'dist.zip'
  fs.unlink(filepath, function(err) {
    if (err) {
      throw err
    }
    console.log('文件:' + filepath + '删除成功！')
    console.log('部署完成')
  })
}
